Skip to content

fix(tables): server-authoritative run badge, tail SSE from latest, harden Stop-all#5492

Merged
TheodoreSpeaks merged 8 commits into
stagingfrom
fix/table-running-number
Jul 7, 2026
Merged

fix(tables): server-authoritative run badge, tail SSE from latest, harden Stop-all#5492
TheodoreSpeaks merged 8 commits into
stagingfrom
fix/table-running-number

Conversation

@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator

Summary

  • Make the "X running" badge server-authoritative: drop the fragile per-event ±1 client deltas and the dead dispatch-scope runningCellCount; refetch the run-state snapshot on a leading+trailing 1s throttle as cell SSE events arrive (cancelRefetch: false + dirty-flag follow-up so slow fetches can't livelock or strand a stale final count)
  • Tail the table SSE stream from the latest event on fresh mount instead of replaying buffered history over freshly-fetched state (fixes the reload animation storm: backwards badge cross-fades + typewriter re-reveals); sessionStorage cursor removed, in-session reconnects still replay-resume; warm-cache in-SPA remounts reconcile with one invalidate
  • Harden Stop-all: insert the dispatch row before the prep work (an early Stop-all had nothing to cancel and silently no-oped), cancel in-flight run-state fetches before optimistic bumps/clears, zero the badge optimistically on Stop, toast on cancel failure, "Stopping…" while pending
  • Header control shows "Queueing" until a cell is actually claimed (was labeling a full table of queued stamps as "N running")
  • Tooltips on all cell status badges (Queued/Cancelled/Pending/Running/Not found/No output); error handled on staging
  • Net server win: dispatches route now does one indexed count; countActiveRunCells' per-refetch rows-ahead COUNT deleted

Type of Change

  • Bug fix

Testing

Tested manually (run-all/stop-all cycles, reload mid-run, batch transitions). Added tests for the events buffer memory path, dispatches route shape, and the stream from param. Full lint, type-check, check:api-validation:strict, check:react-query pass.

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

🤖 Generated with Claude Code

https://claude.ai/code/session_013d4zXsMMwVBmXk33JBok7d

@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Skipped Skipped Jul 7, 2026 10:41pm

Request Review

@cursor

cursor Bot commented Jul 7, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Touches dispatcher cancel ordering, SSE replay semantics, and run-state caching during active workflow runs; bugs could show wrong badges or miss stops, but changes are well-tested and mostly UI/sync hardening.

Overview
Fixes table workflow run UX and correctness by making run counts and live updates server-driven, and by tightening cancel/dispatch lifecycle edge cases.

Run badge & API: Drops runningCellCount and dispatch-scope counting (countActiveRunCells). The dispatches endpoint now returns runningByRowId plus table-wide hasRunning from countRunningCells, with unclaimed pre-stamps included only while a dispatch is active. The client refetches run state on a throttled schedule from SSE instead of maintaining ±1 deltas.

SSE: Fresh mounts connect without from and tail from the latest event id (getLatestTableEventId); optional from preserves replay-on-reconnect. Removes sessionStorage cursor. Prune recovery refetches and tails from latest again.

Header & cells: RunStatusControl shows Queueing until hasRunning (claimed cells) is true. Cell status badges get hover tooltips; pending-upstream distinguishes paused vs upstream wait.

Stop-all / runs: Dispatch row is inserted before long prep so early Stop-all can cancel; spareDispatchId protects the new run; prep failures call cancelDispatchById. Optimistic run/stop cancels in-flight run-state queries; stop clears counts and toasts on failure. Manual run skips firing if dispatch was cancelled during prep.

Reviewed by Cursor Bugbot for commit a5a39a8. Bugbot is set up for automated code reviews on this repo. Configure here.

Comment thread apps/sim/lib/table/workflow-columns.ts Outdated
@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

@greptile-apps

greptile-apps Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR replaces fragile per-event ±1 client-side run-count deltas with a server-authoritative throttled-refetch model and fixes the reload animation storm caused by replaying buffered SSE history over fresh DB state on mount.

  • Server-authoritative badge: runningCellCount removed; the dispatches endpoint now returns runningByRowId + hasRunning and is refetched on a 1 s leading+trailing throttle per cell/dispatch event, with a dirty-flag follow-up so sustained bursts can't livelock.
  • Tail-from-latest on fresh mount: the SSE stream omits from= on first connect; the server resolves getLatestTableEventId and streams only new events, avoiding backwards state replays.
  • Hardened Stop-all: dispatch row inserted before prep work; cancelDispatchById cleans up orphaned rows on prep failure; readDispatch post-prep guards against firing the dispatcher for a cancelled dispatch.
  • UX fixes: "Queueing" label until a cell is actually claimed; per-status tooltips; "Stopping…" while pending; toast on cancel failure.

Confidence Score: 5/5

Safe to merge. The changes are well-reasoned rewrites of previously fragile client-side delta logic, and all edge cases are guarded.

The throttled run-state refetch uses a dirty-flag follow-up so the badge cannot freeze; the prep failure try-catch always re-throws the original error; readDispatch post-prep correctly returns null to prevent firing the dispatcher for a cancelled dispatch; all previous review findings are addressed.

No files require special attention — the API contract change is propagated through every consumer.

Important Files Changed

Filename Overview
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/hooks/use-table-event-stream.ts Core logic rewrite: sessionStorage cursor removed, per-row delta tracking removed, replaced with a leading+trailing throttle (cancelRefetch:false + dirty-flag follow-up). cancelled guard is correctly checked in scheduleDispatchInvalidate; warm-cache reconcile on SPA remount is a clean addition.
apps/sim/lib/table/workflow-columns.ts Dispatch-first ordering fix lands correctly; inner try-catch around cancelDispatchById ensures the original prep error is always re-thrown; readDispatch post-prep check guards against firing a dead dispatcher task.
apps/sim/lib/table/dispatcher.ts countActiveRunCells deleted; countRunningCells simplified to return byRowId+hasRunning from one indexed query. cancelDispatchById added. markActiveDispatchesCancelled refactored to opts object with spareDispatchId support.
apps/sim/app/api/table/[tableId]/events/stream/route.ts fromEventId=undefined triggers getLatestTableEventId inside the try-block so Redis errors propagate rather than falling back to full-buffer replay.
apps/sim/hooks/queries/tables.ts bumpRunState made async; useCancelTableRuns zeroes runningByRowId/hasRunning optimistically with correct per-scope logic; onError restores snapshot and toasts on failure.
apps/sim/lib/table/events.ts getLatestTableEventId added as a pure read using memoryTableStreams.get (no buffer allocation); errors propagate intentionally.
apps/sim/lib/api/contracts/tables.ts runningCellCount removed, replaced by hasRunning. tableEventStreamQuerySchema yields undefined for absent/invalid from values.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/table-grid.tsx hasRunningCell ORs loaded-row scan with server hasRunning flag; correctly included in selection snapshot memo comparison.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/cells/cell-render.tsx BadgeTooltip helper centralises tooltip boilerplate; pending-upstream gets a paused discriminant for distinct tooltip copy.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/run-status-control/run-status-control.tsx queueing prop renders "Queueing" without a count until a worker claims a cell; "Stopping…" while mutation is pending.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table.tsx Both RunStatusControl sites pass queueing={!selection.hasRunningCell}; initial state default is correctly false.
apps/sim/app/api/table/[tableId]/dispatches/route.ts Switched to countRunningCells; includeUnclaimedPreStamps conditioned on active dispatches; response shape updated to runningByRowId+hasRunning.
apps/sim/app/api/table/[tableId]/dispatches/route.test.ts New tests covering revised dispatches endpoint shape, includeUnclaimedPreStamps toggle, and auth guard.
apps/sim/lib/table/events.test.ts New tests for getLatestTableEventId: no-allocate on pure read, correct latest-id tracking, tailing from latest yields no replay.
apps/sim/lib/api/contracts/tables.test.ts Tests verify absent/invalid from yields undefined (tail-from-latest) rather than 0 (full replay), and explicit cursors including 0 are preserved.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant C as Client
    participant SQ as Dispatches API
    participant SS as SSE Stream
    participant DB as Database

    Note over C,DB: Fresh mount
    C->>SQ: GET /dispatches
    SQ->>DB: countRunningCells + listActiveDispatches
    DB-->>SQ: runningByRowId, hasRunning, dispatches
    SQ-->>C: run-state snapshot
    C->>SS: GET /events/stream (no from)
    SS->>DB: getLatestTableEventId
    DB-->>SS: latestId
    SS-->>C: stream from latestId only

    Note over C,DB: Cell events burst
    SS-->>C: cell event N
    C->>C: applyCell + scheduleDispatchInvalidate (leading)
    C->>SQ: GET /dispatches (cancelRefetch false)
    SQ-->>C: updated counts
    SS-->>C: cell events N+1 to N+20
    C->>C: trailing timer fires after 1s
    C->>SQ: GET /dispatches
    SQ-->>C: final counts

    Note over C,DB: Stop-all
    C->>C: cancelQueries + optimistic zero
    C->>SQ: POST /cancel
    SQ->>DB: markActiveDispatchesCancelled
    SQ-->>C: 200 OK
    C->>SQ: invalidateQueries onSettled
    SQ-->>C: reconciled run-state

    Note over C,DB: Reconnect after error
    SS--xC: connection lost
    C->>SS: "GET /events/stream?from=lastEventId"
    SS-->>C: replay and resume
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant C as Client
    participant SQ as Dispatches API
    participant SS as SSE Stream
    participant DB as Database

    Note over C,DB: Fresh mount
    C->>SQ: GET /dispatches
    SQ->>DB: countRunningCells + listActiveDispatches
    DB-->>SQ: runningByRowId, hasRunning, dispatches
    SQ-->>C: run-state snapshot
    C->>SS: GET /events/stream (no from)
    SS->>DB: getLatestTableEventId
    DB-->>SS: latestId
    SS-->>C: stream from latestId only

    Note over C,DB: Cell events burst
    SS-->>C: cell event N
    C->>C: applyCell + scheduleDispatchInvalidate (leading)
    C->>SQ: GET /dispatches (cancelRefetch false)
    SQ-->>C: updated counts
    SS-->>C: cell events N+1 to N+20
    C->>C: trailing timer fires after 1s
    C->>SQ: GET /dispatches
    SQ-->>C: final counts

    Note over C,DB: Stop-all
    C->>C: cancelQueries + optimistic zero
    C->>SQ: POST /cancel
    SQ->>DB: markActiveDispatchesCancelled
    SQ-->>C: 200 OK
    C->>SQ: invalidateQueries onSettled
    SQ-->>C: reconciled run-state

    Note over C,DB: Reconnect after error
    SS--xC: connection lost
    C->>SS: "GET /events/stream?from=lastEventId"
    SS-->>C: replay and resume
Loading

Reviews (8): Last reviewed commit: "fix(tables): widen warm-cache remount ch..." | Re-trigger Greptile

Comment thread apps/sim/lib/table/workflow-columns.ts
@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

Comment thread apps/sim/app/api/table/[tableId]/events/stream/route.ts Outdated
@greptile-apps

greptile-apps Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR hardens the table run UI across three axes: badge accuracy, SSE mount behavior, and Stop-all reliability. The "X running" badge moves from fragile client-side ±1 cell deltas to a server-refetched snapshot throttled at 1 s with a dirty-flag follow-up to prevent freeze on slow fetches; optimistic bumps now cancel any in-flight query before writing to avoid stale responses clobbering the count.

  • Badge / SSE tail: Fresh mounts connect without from and tail from the latest event id (getLatestTableEventId), avoiding the animation storm caused by replaying buffered history over freshly-fetched state; in-session reconnects still replay-resume via in-memory lastEventId.
  • Stop-all hardening: Dispatch row is inserted before the cancel+clear prep work, so an early Stop-all always has a row to cancel; a cancelDispatchById cleanup fires on prep failure to prevent orphaned pending dispatches; bumpRunState and useCancelTableRuns both cancel in-flight run-state queries before writing optimistic data; cancel failure now surfaces a toast.
  • "Queueing" label: Header control renders "Queueing" (no count) until at least one loaded cell transitions to status === 'running', replacing the misleading "N running" shown when the entire batch was still queued; tooltips added to all cell-status badges.

Confidence Score: 4/5

Safe to merge. The core data paths are server-authoritative now, tests cover the new event-buffer and contract shapes, and the Stop-all race condition fix is solid.

The change is well-tested and the main logic — server-refetched badge, tail-from-latest SSE, dispatch-first insertion — is sound. The only noteworthy limitation is hasRunningCell: when the dispatcher's active batch has scrolled entirely out of the loaded viewport, the header flips back from 'N running' to 'Queueing' mid-run. This is called out in the PR description as an intentional tradeoff, but it is a visible inaccuracy in a scenario reachable with large tables.

apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/table-grid.tsx (hasRunningCell limitation) and apps/sim/lib/table/workflow-columns.ts (readDispatch imported separately from other dispatcher functions).

Important Files Changed

Filename Overview
apps/sim/lib/table/workflow-columns.ts Dispatch row is now inserted first (before cancel+clear prep) so Stop-all always has something to cancel. Error path calls cancelDispatchById to avoid orphaned pending rows. Post-prep readDispatch check skips firing the dispatcher for a cancelled dispatch. Minor style: readDispatch is imported separately from other dispatcher functions.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/hooks/use-table-event-stream.ts Replaced per-cell ±1 deltas with server-refetch throttle (leading+trailing 1s, dirty-flag follow-up). Removed sessionStorage cursor: fresh mounts tail from latest event, reconnects resume from in-memory lastEventId. Cleanup guards and cancelled checks are all in order.
apps/sim/hooks/queries/tables.ts bumpRunState is now async and cancels any in-flight run-state fetch before writing optimistic data. useCancelTableRuns gains an optimistic badge zero with per-scope logic and error-path rollback with toast. runningCellCount removed from TableRunState interface.
apps/sim/lib/table/events.ts New getLatestTableEventId: reads the Redis seq key (or memory buffer) without allocating a stream; errors fall back to 0 (full replay). Clean boundary between read-only peek and stream allocation.
apps/sim/lib/table/dispatcher.ts countRunningCells simplified to return Record directly (total removed). New cancelDispatchById for orphan cleanup. markActiveDispatchesCancelled refactored to opts object with spareDispatchId support.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/table-grid.tsx Added hasRunningCell (early-exit scan of loaded rows) to SelectionSnapshot. Passed into table.tsx for the queueing prop. Limitation: false-negatives when running cells are on unloaded pages causes badge to read 'Queueing' mid-run.
apps/sim/app/api/table/[tableId]/dispatches/route.ts Switched from countActiveRunCells to countRunningCells. includeUnclaimedPreStamps gated on active-dispatch presence. runningCellCount dropped from response payload.
apps/sim/app/api/table/[tableId]/events/stream/route.ts Absent from param now tails from latest event id via getLatestTableEventId rather than starting at 0. Comment updated; contract change tested.
apps/sim/lib/api/contracts/tables.ts tableEventStreamQuerySchema now treats absent/invalid from as undefined (tail-from-latest) instead of 0 (full replay). runningCellCount removed from listActiveDispatchesContract response schema.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table.tsx Passes queueing={!selection.hasRunningCell} to both RunStatusControl instances; default hasRunningCell: false added to initial SelectionSnapshot.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/run-status-control/run-status-control.tsx Added queueing prop: renders 'Queueing' (no count) when no cell is claimed, 'N running' otherwise. Button label switches to 'Stopping…' while isPending.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/cells/cell-render.tsx Added BadgeTooltip helper and applied tooltips to all status badges. pending-upstream kind now carries paused boolean. Waiting tooltip migrated to BadgeTooltip, reducing duplication.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Client
    participant SSEHook as useTableEventStream
    participant RQ as React Query Cache
    participant Server as API / DB

    Note over Client,Server: Fresh mount — tail from latest
    Client->>Server: GET /dispatches (fetchTableRunState)
    Server-->>RQ: "{ dispatches, runningByRowId }"
    Client->>Server: GET /events/stream (no `from`)
    Server->>Server: getLatestTableEventId()
    Note over Server: lastEventId = N (no replay)
    Server-->>SSEHook: stream starts at event N+1

    Note over Client,Server: User clicks Run All
    Client->>RQ: cancelQueries(activeDispatches)
    Client->>RQ: setQueryData (optimistic bump)
    Client->>Server: POST runWorkflowColumn
    Server->>Server: insertDispatch (FIRST)
    Server->>Server: cancelPriorRuns + bulkClear
    Server->>Server: readDispatch (check not cancelled)
    Server-->>Client: "{ dispatchId }"
    Server-->>SSEHook: cell SSE events
    SSEHook->>SSEHook: scheduleDispatchInvalidate (throttled)
    SSEHook->>Server: GET /dispatches (refetch)
    Server-->>RQ: updated runningByRowId

    Note over Client,Server: User clicks Stop All
    Client->>RQ: cancelQueries(activeDispatches)
    Client->>RQ: setQueryData (optimistic zero)
    Client->>Server: POST cancelTableRuns
    Server->>Server: markActiveDispatchesCancelled
    Server-->>SSEHook: dispatch cancelled SSE
    SSEHook->>SSEHook: invalidateDispatchesNow (urgent)
    Server-->>RQ: refetch on onSettled
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Client
    participant SSEHook as useTableEventStream
    participant RQ as React Query Cache
    participant Server as API / DB

    Note over Client,Server: Fresh mount — tail from latest
    Client->>Server: GET /dispatches (fetchTableRunState)
    Server-->>RQ: "{ dispatches, runningByRowId }"
    Client->>Server: GET /events/stream (no `from`)
    Server->>Server: getLatestTableEventId()
    Note over Server: lastEventId = N (no replay)
    Server-->>SSEHook: stream starts at event N+1

    Note over Client,Server: User clicks Run All
    Client->>RQ: cancelQueries(activeDispatches)
    Client->>RQ: setQueryData (optimistic bump)
    Client->>Server: POST runWorkflowColumn
    Server->>Server: insertDispatch (FIRST)
    Server->>Server: cancelPriorRuns + bulkClear
    Server->>Server: readDispatch (check not cancelled)
    Server-->>Client: "{ dispatchId }"
    Server-->>SSEHook: cell SSE events
    SSEHook->>SSEHook: scheduleDispatchInvalidate (throttled)
    SSEHook->>Server: GET /dispatches (refetch)
    Server-->>RQ: updated runningByRowId

    Note over Client,Server: User clicks Stop All
    Client->>RQ: cancelQueries(activeDispatches)
    Client->>RQ: setQueryData (optimistic zero)
    Client->>Server: POST cancelTableRuns
    Server->>Server: markActiveDispatchesCancelled
    Server-->>SSEHook: dispatch cancelled SSE
    SSEHook->>SSEHook: invalidateDispatchesNow (urgent)
    Server-->>RQ: refetch on onSettled
Loading

Comments Outside Diff (2)

  1. apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/table-grid.tsx, line 441-450 (link)

    P2 hasRunningCell returns false for running cells on unloaded pages

    hasRunningCell scans only the loaded row slice, so when the dispatcher advances past the visible viewport — rows 1–20 complete, rows 21–100 are running but off-screen — the badge flips back from "N running" to "Queueing" mid-run and suppresses the count display entirely. Since RunStatusControl only shows the numeric count when queueing === false, a user watching rows scroll past completion will briefly see "Queueing" for cells that are genuinely claimed by workers.

    This is noted as an acknowledged tradeoff ("loaded rows are an honest proxy"), but the scenario is reachable in normal usage whenever a user runs a large table and the active batch has scrolled out of view.

  2. apps/sim/lib/table/workflow-columns.ts, line 808-822 (link)

    P2 readDispatch imported separately from the first dispatcher destructure

    readDispatch is pulled in as a second await import('./dispatcher') call after the try/catch, while bulkClearWorkflowGroupCells, cancelDispatchById, insertDispatch, and runDispatcherToCompletion are all destructured in one import at the top of the run path. Since modules are cached, there is no runtime cost, but the split makes it easy to miss readDispatch when scanning what the function uses. Moving readDispatch into the first destructure would keep the function's dependency surface in one place.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Reviews (2): Last reviewed commit: "improvement(tables): co-locate dispatche..." | Re-trigger Greptile

@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

Comment thread apps/sim/hooks/queries/tables.ts Outdated
Comment thread apps/sim/hooks/queries/tables.ts
@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

Comment thread apps/sim/lib/table/workflow-columns.ts
@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

Comment thread apps/sim/hooks/queries/tables.ts Outdated
@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

Comment thread apps/sim/lib/table/workflow-columns.ts

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0c7e829. Configure here.

Comment thread apps/sim/app/api/table/[tableId]/events/stream/route.ts
@TheodoreSpeaks

Copy link
Copy Markdown
Collaborator Author

@greptile review

@TheodoreSpeaks TheodoreSpeaks merged commit 60e3509 into staging Jul 7, 2026
18 checks passed
@TheodoreSpeaks TheodoreSpeaks deleted the fix/table-running-number branch July 7, 2026 23:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant